package com.xiaoh.dormitoryrepairreportbackend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaoh.dormitoryrepairreportbackend.model.dto.common.PageResponse;
import com.xiaoh.dormitoryrepairreportbackend.model.dto.workorder.WorkOrderQueryRequest;
import com.xiaoh.dormitoryrepairreportbackend.model.dto.workorder.WorkOrderResponse;
import com.xiaoh.dormitoryrepairreportbackend.model.dto.workorder.WorkOrderStatsResponse;
import com.xiaoh.dormitoryrepairreportbackend.model.entity.WorkOrder;

/**
 * 工单表 服务类
 */
public interface WorkOrderService extends IService<WorkOrder> {

    /**
     * 生成工单编号
     *
     * @return 工单编号
     */
    String generateWorkOrderId();

    /**
     * 创建工单
     *
     * @param workOrder 工单信息
     * @return 工单ID
     */
    Long createWorkOrder(WorkOrder workOrder);

    /**
     * 创建工单并尝试AI自动分配
     *
     * @param workOrder 工单信息
     * @return 工单ID
     */
    Long createWorkOrderWithAiAssignment(WorkOrder workOrder);

    /**
     * 分配工单
     *
     * @param workOrderId 工单ID
     * @param handlerId   处理人ID
     * @return 是否成功
     */
    boolean assignWorkOrder(Long workOrderId, Long handlerId);

    /**
     * 更新工单状态
     *
     * @param workOrderId 工单ID
     * @param status      状态
     * @param operatorId  操作人ID
     * @return 是否成功
     */
    boolean updateWorkOrderStatus(Long workOrderId, Integer status, Long operatorId);

    /**
     * 评价工单
     *
     * @param workOrderId   工单ID
     * @param rating        评分
     * @param reviewComment 评价内容
     * @param operatorId    操作人ID
     * @return 是否成功
     */
    boolean reviewWorkOrder(Long workOrderId, Integer rating, String reviewComment, Long operatorId);

    /**
     * 分页查询工单列表（多条件查询）
     * 返回包含脱敏用户信息的工单响应DTO和完整分页信息
     * 使用游标分页保持性能，同时提供分页信息
     *
     * @param queryRequest 查询条件
     * @return 分页响应，包含工单列表和分页信息
     */
    PageResponse<WorkOrderResponse> listWorkOrderPageWithConditions(WorkOrderQueryRequest queryRequest);

    /**
     * 获取工单统计信息
     *
     * @return 工单统计响应
     */
    WorkOrderStatsResponse getWorkOrderStats();
}
